﻿//-----------------------------------------------------------------------------
// <copyright file="ITestableModel.cs" company="SemQQQ">
//     Copyright (c) SemQQQ. All rights reserved. CPOL Licence
// </copyright>
// <author name="Sem Shekhovtsov" email="semshehovtsov@gmail.com"/>
//-----------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CA.Modes
{ 
    /// <summary>
    /// Implement this interface to run your rules on the CAMachine. 
    /// See the example of the implementation in the CA.SampleTestableModels.HarmonicOscillator class 
    /// </summary>
    public interface ITestableModel
    {
        // Name of the model
        string Name { get; }

        // Not used for now
        int GetCapacity();

        /// <summary>
        /// Perform modifications of the matrices in this method implementation
        /// sketch the SdlScreenPixelBuffer plane to visualize the result on the screen
        /// </summary>
        /// <param name="Dim0">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim1">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim2">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim3">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim4">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim5">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim6">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim7">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim8">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim9">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim10">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="iterationsCount">Count of iterations to perform. Count of 'clock ticks'</param>
        /// <param name="height">Count of particles (cells) in vertical dimension</param>
        /// <param name="width">Count of particles (cells) in horizontal dimension</param>
        /// <param name="SdlScreenPixelBuffer">Plane for visualization of the proccess</param>
        /// <param name="colors">List of palette colors</param>
        void Test(ref IntPtr Dim0, ref IntPtr Dim1, ref IntPtr Dim2, ref IntPtr Dim3, ref IntPtr Dim4, ref IntPtr Dim5,
                  ref IntPtr Dim6, ref IntPtr Dim7, ref IntPtr Dim8,
                  ref IntPtr Dim9, ref IntPtr Dim10, int iterationsCount, int height, int width,
                  IntPtr SdlScreenPixelBuffer, IntPtr colors);

        /// <summary>
        /// Displaying the current state of the system.
        /// Used to visualize the current state.
        /// </summary>
        /// <param name="Dim0">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim1">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim2">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim3">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim4">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim5">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim6">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim7">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim8">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim9">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="Dim10">Two dimensional matrix stored in memory as one dimensional array</param>
        /// <param name="iterationsCount">Count of iterations to perform. Count of 'clock ticks'</param>
        /// <param name="height">Count of particles (cells) in vertical dimension</param>
        /// <param name="width">Count of particles (cells) in horizontal dimension</param>
        /// <param name="SdlScreenPixelBuffer">Plane for visualization of the proccess</param>
        /// <param name="colors">List of palette colors</param>
        void Show(ref IntPtr Dim0, ref IntPtr Dim1, ref IntPtr Dim2, ref IntPtr Dim3, ref IntPtr Dim4, ref IntPtr Dim5,
                  ref IntPtr Dim6, ref IntPtr Dim7, ref IntPtr Dim8,
                  ref IntPtr Dim9, ref IntPtr Dim10, int height, int width,
                  IntPtr SdlScreenPixelBuffer, IntPtr colors);
    }
}
